/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.colegiatura.beans;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.cip.esymons.colegiatura.bc.ColegiadoDelegate;
import org.cip.esymons.colegiatura.bc.ColegiadoEspecialidadDelegate;
import org.cip.esymons.colegiatura.bc.DirectivosDelegate;
import org.cip.esymons.colegiatura.bc.PaisDelegate;
import org.cip.esymons.colegiatura.bc.PersonaNaturalDelegate;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.colegiatura.be.TipoColegiado;
import org.cip.esymons.general.be.Area;
import org.cip.esymons.general.be.Cargo;
import org.cip.esymons.general.be.ColegiadoEspecialidad;
import org.cip.esymons.general.be.Directivos;
import org.cip.esymons.general.be.Pais;
import org.cip.esymons.general.be.PersonaNatural;

/**
 *
 * @author ADMINISTRADOR
 */
public class directivosController {

    private DirectivosDelegate delegadoDirectivo;
    private ColegiadoDelegate delegadoColegiado;
    private PaisDelegate delegadoPais;
    private PersonaNaturalDelegate delegadoPersona;
    private busqColXCip.Colegiado colegiadoWS;
    private ColegiadoEspecialidadDelegate delegadoColEsp;

    private ColegiadoEspecialidad colEsp;
    private Directivos directivos;
    private Colegiado colegiado;
    private PersonaNatural personaNatural;
    private Cargo cargo;
    private Area area;
    private Pais pais;
    private TipoColegiado tipoColegiado;

    private String codigoCIP;
    private int nroCIP;
    private boolean bandera;

    private Date fecha1,fecha2,fechaIni,fechaFin;
    List<Directivos> listaDirectivosPeriodo;
    List<Directivos> RelacionDirectivos;
    private String periodo;
    private Integer seleccion;
    private Integer otroDirectivo;
    private Integer cantidad;

    public directivosController() {

        delegadoDirectivo = new DirectivosDelegate();
        delegadoColegiado = new ColegiadoDelegate();
        delegadoPais = new PaisDelegate();
        delegadoPersona = new PersonaNaturalDelegate();
        colegiadoWS = new busqColXCip.Colegiado();
        delegadoColEsp = new ColegiadoEspecialidadDelegate();

        colEsp = new ColegiadoEspecialidad();
        directivos = new Directivos();
        colegiado = new Colegiado();
        personaNatural = new PersonaNatural();
        tipoColegiado = new TipoColegiado();
        pais = new Pais();
        area = new Area();
        bandera = false;
        otroDirectivo = 0;
        listaDirectivosPeriodo = new ArrayList<Directivos>();
        listaDirectivosPeriodo = null;
        RelacionDirectivos = new ArrayList<Directivos>();
        RelacionDirectivos = null;
    }

    public ColegiadoEspecialidad getColEsp() {
        return colEsp;
    }

    public void setColEsp(ColegiadoEspecialidad colEsp) {
        this.colEsp = colEsp;
    }

    public ColegiadoEspecialidadDelegate getDelegadoColEsp() {
        return delegadoColEsp;
    }

    public void setDelegadoColEsp(ColegiadoEspecialidadDelegate delegadoColEsp) {
        this.delegadoColEsp = delegadoColEsp;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public List<Directivos> getRelacionDirectivos() {
        return RelacionDirectivos;
    }

    public void setRelacionDirectivos(List<Directivos> RelacionDirectivos) {
        this.RelacionDirectivos = RelacionDirectivos;
    }

    public TipoColegiado getTipoColegiado() {
        return tipoColegiado;
    }

    public void setTipoColegiado(TipoColegiado tipoColegiado) {
        this.tipoColegiado = tipoColegiado;
    }

    public int getNroCIP() {
        return nroCIP;
    }

    public void setNroCIP(int nroCIP) {
        this.nroCIP = nroCIP;
    }

    public busqColXCip.Colegiado getColegiadoWS() {
        return colegiadoWS;
    }

    public void setColegiadoWS(busqColXCip.Colegiado colegiadoWS) {
        this.colegiadoWS = colegiadoWS;
    }

    public PersonaNatural getPersonaNatural() {
        return personaNatural;
    }

    public void setPersonaNatural(PersonaNatural personaNatural) {
        this.personaNatural = personaNatural;
    }

    public PersonaNaturalDelegate getDelegadoPersona() {
        return delegadoPersona;
    }

    public void setDelegadoPersona(PersonaNaturalDelegate delegadoPersona) {
        this.delegadoPersona = delegadoPersona;
    }

    public PaisDelegate getDelegadoPais() {
        return delegadoPais;
    }

    public void setDelegadoPais(PaisDelegate delegadoPais) {
        this.delegadoPais = delegadoPais;
    }

    public Pais getPais() {
        return pais;
    }

    public void setPais(Pais pais) {
        this.pais = pais;
    }

    public Integer getOtroDirectivo() {
        return otroDirectivo;
    }

    public void setOtroDirectivo(Integer otroDirectivo) {
        this.otroDirectivo = otroDirectivo;
    }

    public String getPeriodo() {
        return periodo;
    }

    public void setPeriodo(String periodo) {
        this.periodo = periodo;
    }

    public Integer getSeleccion() {
        return seleccion;
    }

    public void setSeleccion(Integer seleccion) {
        this.seleccion = seleccion;
    }


    public List<Directivos> getListaDirectivosPeriodo() {
        return listaDirectivosPeriodo;
    }

    public void setListaDirectivosPeriodo(List<Directivos> listaDirectivosPeriodo) {
        this.listaDirectivosPeriodo = listaDirectivosPeriodo;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public Date getFechaIni() {
        return fechaIni;
    }

    public void setFechaIni(Date fechaIni) {
        this.fechaIni = fechaIni;
    }

    public Date getFecha1() {
        return fecha1;
    }

    public void setFecha1(Date fecha1) {
        this.fecha1 = fecha1;
    }

    public Date getFecha2() {
        return fecha2;
    }

    public void setFecha2(Date fecha2) {
        this.fecha2 = fecha2;
    }

    public Area getArea() {
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }

    public Cargo getCargo() {
        return cargo;
    }

    public void setCargo(Cargo cargo) {
        this.cargo = cargo;
    }

    public Colegiado getColegiado() {
        return colegiado;
    }

    public void setColegiado(Colegiado colegiado) {
        this.colegiado = colegiado;
    }

    public ColegiadoDelegate getDelegadoColegiado() {
        return delegadoColegiado;
    }

    public void setDelegadoColegiado(ColegiadoDelegate delegadoColegiado) {
        this.delegadoColegiado = delegadoColegiado;
    }

    public DirectivosDelegate getDelegadoDirectivo() {
        return delegadoDirectivo;
    }

    public void setDelegadoDirectivo(DirectivosDelegate delegadoDirectivo) {
        this.delegadoDirectivo = delegadoDirectivo;
    }

    public Directivos getDirectivos() {
        return directivos;
    }

    public void setDirectivos(Directivos directivos) {
        this.directivos = directivos;
    }

    public Directivos buscaDirectivo(Integer codigo){

        return delegadoDirectivo.find(codigo);
    }

    public String getCodigoCIP() {
        return codigoCIP;
    }

    public void setCodigoCIP(String codigoCIP) {
        this.codigoCIP = codigoCIP;
    }

    public boolean getBandera() {
        return bandera;
    }

    public void setBandera(boolean bandera) {
        this.bandera = bandera;
    }

    //listado de todos los directivos
    public List<Directivos> getListaDirectivos(){

        RelacionDirectivos = new ArrayList<Directivos>();
        return RelacionDirectivos = delegadoDirectivo.findAll();
    }

    public String nuevo(){

        colegiadoWS = new busqColXCip.Colegiado();
        directivos = new Directivos();
        colegiado = new Colegiado();
        personaNatural = new PersonaNatural();
        tipoColegiado = new TipoColegiado();
        pais = new Pais();
        area = new Area();
        nroCIP = 0;
        return "nuevo";
    }

    public String editar(){

        return "editar";
    }

    public String grabar(){

        directivos.setColCodigo(colegiado);
        directivos.setDirActivo(false);
        delegadoDirectivo.create(directivos);

        colegiado = new Colegiado();
        directivos = new Directivos();
        bandera = false;
        otroDirectivo = null;
        mostrarMensaje("INFO: ", "Directivo registrado satisfactoriamente...", FacesMessage.SEVERITY_INFO);
        return "listado";
    }

    public String guardaSecretarioCN(){

        personaNatural.setPerActivo(true);
        personaNatural.setPerfechaRegistro(new Date());
        personaNatural.setPertieneImagen(false);
        personaNatural.setPerTipo(1);
        delegadoPersona.create(personaNatural);

        colegiado.setPersonaNatural(personaNatural);
        colegiado.setColCondicion(true);
        colegiado.setColestaVivo(true);
        pais = delegadoPais.buscaPeru();
        colegiado.setPais(pais);
        tipoColegiado.setTcoCodigo(2);
        colegiado.setTipoColegiado(tipoColegiado);
        
        delegadoColegiado.create(colegiado);       

        directivos.setColCodigo(colegiado);
        directivos.setDirActivo(false);
        delegadoDirectivo.create(directivos);

        directivos = new Directivos();
        colegiado = new Colegiado();
        personaNatural = new PersonaNatural();
        colegiadoWS = new busqColXCip.Colegiado();
        nroCIP = 0;
        otroDirectivo = null;
        mostrarMensaje("INFO: ", "Directivo registrado satisfactoriamente...", FacesMessage.SEVERITY_INFO);
        return "listado";
    }
    
    public String actualiza(){

        delegadoDirectivo.edit(directivos);
        directivos = new Directivos();
        return "listado";
    }

    public String listado(){

        bandera = false;
        return "listado";
    }

    public String remover(){

        delegadoDirectivo.remove(directivos);
        directivos = new Directivos();
        return null;
    }

    public String buscarColegiadoWS() throws ParseException{

        colegiadoWS = delegadoColegiado.buscarColegiadoWS(nroCIP);

        if(colegiadoWS != null){
            personaNatural.setPerNombres(colegiadoWS.getWs_Nomb());
            personaNatural.setPerapellidoPaterno(colegiadoWS.getWs_apePat());
            personaNatural.setPerapellidoMaterno(colegiadoWS.getWs_apeMat());

            String fechaNac = colegiadoWS.getWs_fech_nac();
            SimpleDateFormat sdfn= new SimpleDateFormat("yyyy-MM-dd");
            Date dateNac = sdfn.parse(fechaNac);

            personaNatural.setPerfechaNacimiento(dateNac);
            personaNatural.setPerNroDNI(colegiadoWS.getWs_dni());
            personaNatural.setSolcorreocip(colegiadoWS.getWs_mail_cip());

            String fechaIncorp = colegiadoWS.getWs_fech_incorp();
            SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
            Date dateIncorp = sdf.parse(fechaIncorp);

            colegiado.setColfechaIncorporacion(dateIncorp);
            colegiado.setColnumeroCip(String.valueOf(nroCIP));
        }else{
            colegiadoWS = new busqColXCip.Colegiado();
            mostrarMensaje("INFO: ", "No se encontro el colegiado...", FacesMessage.SEVERITY_INFO);
        }

        return null;
    }

    public String buscaCIP(){

        try {
            colegiado = new Colegiado();
            directivos = new Directivos();

             if(codigoCIP.length()<3){
                     codigoCIP = "0000"+ codigoCIP;
                 }else{
                       if(codigoCIP.length()<4){
                           codigoCIP = "000"+codigoCIP;
                       }else{
                           if(codigoCIP.length()<5){
                               codigoCIP = "00"+codigoCIP;
                           }else{
                               if(codigoCIP.length()<6){
                                  codigoCIP = "0"+codigoCIP;
                               }
                           }
                       }
                 }
            bandera = true;          
            colegiado = delegadoColegiado.buscaPorCip(codigoCIP);           
            codigoCIP = null;
            return null;
        } catch (Exception e) {
            return null;
        }
    }


    //METODO PARA ACTIVAR EL PERIODO QUE ENTRA EN VIGENCIA

    public String desactivarDirectivos(){

        List<Directivos> listaDirectivos = new ArrayList<Directivos>();
        Directivos direc = new Directivos();

        listaDirectivos = delegadoDirectivo.findAll();

        for(int i=0;i<listaDirectivos.size();i++){

            direc = listaDirectivos.get(i);
            direc.setDirActivo(false);
            delegadoDirectivo.edit(direc);

        }
        direc = new Directivos();
        return null;
    }

    public String activarPeriodo(){

        List<Directivos> listaDirActivos =  new ArrayList<Directivos>();
        Directivos directivoActivo =  new Directivos();

        desactivarDirectivos();

        if(fecha1 != null && fecha2 != null){
            listaDirActivos = delegadoDirectivo.listaDirectivosPorPeriodo(fecha1, fecha2);
            //listaDirectivosPorPeriodoOrdenCip(fecha1, fecha2);

            for(int j=0; j<listaDirActivos.size();j++){

                directivoActivo =  new Directivos();
                directivoActivo = listaDirActivos.get(j);

                directivoActivo.setDirActivo(true);
                delegadoDirectivo.edit(directivoActivo);
            }
            listaDirActivos =  new ArrayList<Directivos>();
        }else{
            listaDirActivos = RelacionDirectivos;
            for(Directivos dir : listaDirActivos){
                
                delegadoDirectivo.edit(dir);

            }
        }
        getListaDirectivos();
        mostrarMensaje("INFO: ", "Periodo Activado satisfactoriamente...", FacesMessage.SEVERITY_INFO);
        return null;
    }

    //LISTADO DE DIRECTIVOS POR PERIODO

    public List<Directivos> listaDirectivosOrdenCIP(){

        cantidad = null;
        listaDirectivosPeriodo = null;
        listaDirectivosPeriodo =  delegadoDirectivo.listaDirectivosPorPeriodoOrdenCip(fechaIni, fechaFin);
        cantidad = listaDirectivosPeriodo.size();
        return listaDirectivosPeriodo;
    }

    public List<Directivos> listaDirectivosOrdenApellidos(){

        cantidad = null;
        listaDirectivosPeriodo = null;
        listaDirectivosPeriodo =  delegadoDirectivo.listaDirectivosPorPeriodoOrdenApellidos(fechaIni, fechaFin);
        cantidad = listaDirectivosPeriodo.size();
        return listaDirectivosPeriodo;
    }

    public List<Directivos> listaDirectivosOrdenCargo(){

        cantidad = null;
        listaDirectivosPeriodo = null;
        listaDirectivosPeriodo =  delegadoDirectivo.listaDirectivosPorPeriodoOrdenCargo(fechaIni, fechaFin);
        cantidad = listaDirectivosPeriodo.size();
        return listaDirectivosPeriodo;
    }

    public List<Directivos> listaTodosDirectivos(){

        cantidad = null;
        listaDirectivosPeriodo = null;
        listaDirectivosPeriodo =  delegadoDirectivo.findAll();
        cantidad = listaDirectivosPeriodo.size();

        for(Directivos direc : listaDirectivosPeriodo){

            colEsp = new ColegiadoEspecialidad();
            colEsp = delegadoColEsp.colegiadoEsp(direc.getColCodigo().getSolCodigo());

            if(colEsp != null){
                direc.setColegiadoEspecialidad(colEsp);
            }
        }
        return listaDirectivosPeriodo;
    }

    public List<Directivos> listaTodosDirectivosActivos(){

        cantidad = null;
        listaDirectivosPeriodo = null;
        listaDirectivosPeriodo =  delegadoDirectivo.listaDirectivosPeriodoActivo();
        cantidad = listaDirectivosPeriodo.size();

        for(Directivos direc : listaDirectivosPeriodo){

            colEsp = new ColegiadoEspecialidad();
            colEsp = delegadoColEsp.colegiadoEsp(direc.getColCodigo().getSolCodigo());

            if(colEsp != null){
                direc.setColegiadoEspecialidad(colEsp);
            }
        }
        return listaDirectivosPeriodo;
    }
    public String listarDirectivosXPeriodo(){

        if(seleccion==null){
            seleccion = 1;
        }
        if(fechaIni == null && fechaFin == null){
            seleccion = 5;
        }

        switch(seleccion){
            
            case 1: listaDirectivosOrdenCIP();
                    fecha1 = fechaIni;
                    fecha2 = fechaFin;
                    SimpleDateFormat sdfp1 = new SimpleDateFormat("yyyy");
                    SimpleDateFormat sdfp2 = new SimpleDateFormat("yyyy");
                    periodo = sdfp1.format(fecha1)+ " - "+sdfp2.format(fecha2);
                    fechaIni=null;
                    fechaFin=null;
                    break;
            case 2: listaDirectivosOrdenCIP();
                    fecha1 = fechaIni;
                    fecha2 = fechaFin;
                    SimpleDateFormat sdfp11 = new SimpleDateFormat("yyyy");
                    SimpleDateFormat sdfp22 = new SimpleDateFormat("yyyy");
                    periodo = sdfp11.format(fecha1)+ " - "+sdfp22.format(fecha2);
                    fechaIni=null;
                    fechaFin=null;
                    break;
            case 3: listaDirectivosOrdenCIP();
                    fecha1 = fechaIni;
                    fecha2 = fechaFin;
                    SimpleDateFormat sdfp111 = new SimpleDateFormat("yyyy");
                    SimpleDateFormat sdfp222 = new SimpleDateFormat("yyyy");
                    periodo = sdfp111.format(fecha1)+ " - "+sdfp222.format(fecha2);
                    fechaIni=null;
                    fechaFin=null;                    
                    break;
            case 4: listaTodosDirectivosActivos();
                    break;
            case 5: listaTodosDirectivos();
                    break;
        }


        return null;
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }
}
